package co.com.coomeva.adminEvaluacion.logica;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Criteria;
import org.hibernate.LockMode;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Expression;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Order;

//import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPAccion;
//import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPAccion;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPItem;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPModulo;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPModuloPeriodo;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPModuloPeriodoId;
import co.com.coomeva.adminEvaluacion.modelo.entidades.EdPTipoPorcentaje;
import co.com.coomeva.adminEvaluacion.modelo.persistencia.EdPModuloDAO;
import co.com.coomeva.adminEvaluacion.modelo.persistencia.EdPModuloPeriodoDAO;


/**
 * A data access object (DAO) providing persistence and search support for
 * EdPModulo entities. Transaction control of the save(), update() and delete()
 * operations can directly support Spring container-managed transactions or they
 * can be augmented to handle user-managed Spring transactions. Each of these
 * methods provides additional information for how to configure it for the
 * desired type of transaction control.
 * 
 * @see co.com.coomeva.adminEvaluacion.modelo.entidades.EdPModulo
 * @author MyEclipse Persistence Tools
 */

public class EdPModuloLogica {
	private static EdPModuloLogica moduloLogica = null;
	
	//Objeto con el que se accede a la BD
	private EdPModuloDAO moduloDAO = null;
	
	public EdPModuloLogica() {
		moduloDAO = new EdPModuloDAO();
	}
	
	public static EdPModuloLogica getInstance()	{
		if(moduloLogica == null) {
			moduloLogica = new EdPModuloLogica();
		}
		return moduloLogica;
	}
	
	public List<EdPModulo> consultarModulos() throws Exception {
		Session session = moduloDAO.getSession();
		List<EdPModulo> valorList = new ArrayList<EdPModulo>();
		
		try {
			Criteria criterios = session.createCriteria(EdPModulo.class);
			
			//Set edPModuloPeriodos = new HashSet(0);
			//EdPModuloPeriodo a = new EdPModuloPeriodo();
			//a.set
			
			//edPModuloPeriodos.
			
			/*
			if (consAccion != null && consAccion.longValue() > 0) {
				criterios.add(Expression.eq("consAccion", consAccion));
			}
			
			if (accion != null) {
				criterios.add(Expression.ilike("accion", accion, MatchMode.ANYWHERE));
			}
			*/
			
			//criterios.addOrder(Order.asc("consAccion"));
			
			valorList = criterios.list();
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error consultando los registros");
		} finally {
			moduloDAO.getSession().clear();
			moduloDAO.getSession().close();
		}
		return valorList;
	}
	
	@SuppressWarnings("unchecked")
	public List<EdPModulo> consultarModulos(Long consModulo, String nombre, String descripcion,
			Long pcjeJefe, String lista, String tipo, String plan, Long pcjeColaborador) throws Exception {

		Session session = moduloDAO.getSession();
		List<EdPModulo> valorList = new ArrayList<EdPModulo>();
		
		try {
			Criteria criterios = session.createCriteria(EdPModulo.class);
			if (consModulo != null && consModulo.longValue() > 0)
				criterios.add(Expression.eq("consModulo", consModulo));
			
			if (nombre != null && nombre.trim().length() > 0)
				criterios.add(Expression.ilike("nombre", nombre, MatchMode.ANYWHERE));
			
			if (descripcion != null && descripcion.trim().length() > 0)
				criterios.add(Expression.ilike("descripcion", descripcion, MatchMode.ANYWHERE));
			
			if (pcjeJefe != null && pcjeJefe.longValue() > 0)
				criterios.add(Expression.eq("pcjeJefe", pcjeJefe));
			
			if (lista != null && lista.trim().length() > 0)
				criterios.add(Expression.ilike("lista", lista, MatchMode.ANYWHERE));
			
			if (tipo != null && tipo.trim().length() > 0)
				criterios.add(Expression.ilike("tipo", tipo, MatchMode.ANYWHERE));
			
			if (plan != null && plan.trim().length() > 0)
				criterios.add(Expression.ilike("plan", plan, MatchMode.ANYWHERE));
			
			if (pcjeColaborador != null && pcjeColaborador.longValue() > 0)
				criterios.add(Expression.eq("pcjeColaborador", pcjeColaborador));
						
			criterios.addOrder(Order.asc("consModulo"));
			valorList = criterios.list();
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception("Error consultando los registros");
		} finally {
			//moduloDAO.getSession().clear();
			//moduloDAO.getSession().close();
		}
		return valorList;
	}

	public void asociarModulosActivosConPeriodo(Long consPeriodo) {
	}

	public void modificarPorcentajes(List<EdPModulo> listModulo) throws Exception {
		Transaction trans = null;
		EdPModulo objTMP2;
		EdPModulo objTMP;
		Long porcenJefeAcum;
		Long porcenColabAcum;
		try {
			if (listModulo != null && listModulo.size() > 0) {
				porcenJefeAcum = new Long("0");
				porcenColabAcum = new Long("0");
				for (Iterator<EdPModulo> iter = listModulo.iterator(); iter.hasNext();) {
					objTMP = (EdPModulo) iter.next();
					
					//Evalua si ambos porcentajes son iguales a 100
					if (objTMP.getPcjeJefe() != null) {
						porcenJefeAcum = new Long(porcenJefeAcum.longValue() + objTMP.getPcjeJefe().longValue()); 
					} else {
						throw new Exception("Todos los porcentajes son obligatorios");
					}
					
					if (objTMP.getPcjeColaborador() != null) {
						porcenColabAcum = new Long(porcenColabAcum.longValue() + objTMP.getPcjeColaborador().longValue()); 
					} else {
						throw new Exception("Todos los porcentajes son obligatorios");
					}
				}
				
				if (porcenJefeAcum.longValue() != 100l) {
					throw new Exception("La sumatoria de porcentajes de modulos para el jefe es diferente de 100%");
				}
				
				if (porcenColabAcum.longValue() != 100l) {
					throw new Exception("La sumatoria de porcentajes de modulos para el colaborador es diferente de 100%");
				}
				
				//Actualiza los porcentajes...
				try {
					trans = moduloDAO.getSession().beginTransaction();
					for (Iterator<EdPModulo> iter = listModulo.iterator(); iter.hasNext();) {
						objTMP = (EdPModulo) iter.next();
						objTMP2 = consultarModuloPorID(objTMP.getConsModulo());
						objTMP2.setPcjeJefe(objTMP.getPcjeJefe());
						objTMP2.setPcjeColaborador(objTMP.getPcjeColaborador());
						
						moduloDAO.merge(objTMP2);
					}
					trans.commit();
				} catch (Exception e) {
					trans.rollback();
					throw new Exception("Error al actualizar los porcentajes de modulos");
				}
				
			} else {
				throw new Exception("No hay modulos para modificar");
			}
		} catch (Exception e) {
			e.printStackTrace();
			throw new Exception(e.getMessage());
		} finally {
			trans=null;
			objTMP2 = null;
			objTMP = null;
			porcenJefeAcum = null;
			porcenColabAcum = null;
			moduloDAO.getSession().clear();
			moduloDAO.getSession().close();
		}
	}
	
	public EdPModulo consultarModuloPorID(Long consModulo) throws Exception {
		try {
			return moduloDAO.findById(consModulo);
		} catch (Exception e) {
			throw new Exception("Error consultando el modulo "+consModulo+" -> "+e.getMessage());
		} finally {
			//moduloDAO.getSession().clear();
			//moduloDAO.getSession().close();
		}
	}
	
}